parser grammar ExpParser;

options {
  language = Java;
  tokenVocab = ExpLexer;
}

@header {
  package ejercicio1;
}

@members {
      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }

    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
}

entrada : instrucciones EOF;
instrucciones  : (instruccion)*;
instruccion returns[int value] : exp SEPARADOR 
            {System.out.println("Expresion: "+$exp.value);
            $value = $exp.value;};
exp returns [int value] : 
                e=exp_mult {$value = $e.value;}
                (
                SUMA e=exp_mult {$value += $e.value;}
                |
                RESTA e=exp_mult {$value -= $e.value;}
                )* ;
exp_mult returns [int value] : 
                e=exp_base{$value = $e.value;} 
                (
                MUL e=exp_base {$value *= $e.value;}
                |
                DIV e=exp_base {$value /= $e.value;}
                )* ;
exp_base returns [int value]: 
                  NUMERO {$value = Integer.parseInt($NUMERO.text);} 
                  |
                   PARENTESIS exp PARENTESIS {$value = $exp.value;};